package cn.cj.erp.service.system;

import cn.cj.erp.common.enums.StatusEnum;
import cn.cj.erp.bo.system.SysUserBo;
import cn.cj.erp.entity.system.SysUser;
import cn.cj.erp.service.base.BaseService;

import java.util.List;
import java.util.Set;

/**
 * 系统用户
 *
 * @author jianchene0
 */
public interface SysUserService extends BaseService<SysUser, SysUserBo> {

    /**
     * 获取用户角色名称（多个）
     * @param id 用户id
     * @return 角色名称（多个）
     */
    String listUserRoleGroup(Long id);

    /**
     * 根据用户名获取用户
     *
     * @param username 用户名
     * @return 用户
     */
    SysUserBo getByUsername(String username);

    /**
     * 获取菜单权限列表
     *
     * @param id 主键
     * @return 权限列表
     */
    Set<String> listMenuPermById(Long id);

    /**
     * 获取角色权限列表
     *
     * @param id 主键
     * @return 角色权限列表
     */
    Set<String> listRolePermById(Long id);

    /**
     * 根据ID获取菜单ID列表
     *
     * @param id 主键
     * @return 菜单ID列表
     */
    List<Long> listMenuIdById(Long id);

    /**
     * 更新登录信息
     * @param user 实体类
     * @return boolean
     */
    boolean updateLogin(SysUserBo user);

    /**
     * 更新密码
     *
     * @param id          主键
     * @param password    原密码
     * @param newPassword 新密码
     * @return true-成功 false-失败
     */
    boolean updatePassword(Long id, String password, String newPassword);

    /**
     * 根据用户ID更新状态
     * @param userId 用户ID
     * @param status   状态
     * @return boolean
     */
    boolean updateStatusById(Long userId, StatusEnum status);

    /**
     * 重置用户状态、密码输错次数和最后改密时间
     *
     * @param id 主键
     */
    boolean resetUserById(Long id);

    /**
     * 校验用户名是否唯一
     * @param bo 用户实体类
     * @return true唯一  false不唯一
     */
    boolean checkUsernameUnique(SysUserBo bo);

    /**
     * 校验邮箱是否唯一
     * @param bo 用户实体类
     * @return true唯一  false不唯一
     */
    boolean checkEmailUnique(SysUserBo bo);

    /**
     * 校验手机是否唯一
     * @param bo 用户实体类
     * @return true唯一  false不唯一
     */
    boolean checkPhoneUnique(SysUserBo bo);

    /**
     * 查询部门下是否有用户
     * @param deptId 部门ID
     * @return boolean
     */
    boolean checkDeptExistById(Long deptId);

    /**
     * 更改用户状态
     * @param username 用户名
     * @param status 状态
     * @return 更新结果
     */
    boolean updateStatusByUsername(String username, StatusEnum status);
}
